package com.imooc.ad.service;

import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.DeleteRowsEventData;
import com.github.shyiko.mysql.binlog.event.EventData;
import com.github.shyiko.mysql.binlog.event.UpdateRowsEventData;
import com.github.shyiko.mysql.binlog.event.WriteRowsEventData;

/**
 *  测试开源工具mysql-binlog-connector-java
 *  监听Binlog，监听 MySQL 数据表状态的变化，并解析成想要的格式（Java 对象）
 *  在resources新建解析Binlog的模板文件template.json，定义监听的数据库、数据表的解析格式
 *  对应json文件中的各个表、数据库，实现对模板文件的构造，在mysql/dto新建JsonTable、Template、TableTemplate
 */
public class BinlogServiceTest {

    public static void main(String[] args) throws Exception {

        //构造 BinaryLogClient，填充 MySQL 的地址信息
        BinaryLogClient client = new BinaryLogClient(
                "127.0.0.1",
                3306,
                "root",
                "123456"
        );
        //开始监听读取binlog的文件名和位置，否则从最新当前位置开始
        //client.setBinlogFilename("binlog.000037");
        //client.setBinlogPosition();

        //给 BinaryLogClient 注册监听器，实现对 Binlog 的监听和解析，event 就是监听到的 Binlog 变化信息
        client.registerEventListener(event -> {

            // 获取 event 中的数据部分
            EventData data = event.getData();

            // 只关注Binlog 中的“增删改”
            if (data instanceof UpdateRowsEventData) {
                System.out.println("Update--------------");
                System.out.println(data.toString());
            } else if (data instanceof WriteRowsEventData) {
                System.out.println("Write---------------");
                System.out.println(data.toString());
            } else if (data instanceof DeleteRowsEventData) {
                System.out.println("Delete--------------");
                System.out.println(data.toString());
            }
        });
        //连接数据库
        //把自己伪装成 Slave，连接到 MySQL Master，开始监听(当前的线程会 Hang 住，BinlogClient中需要启动新线程)
        client.connect();
    }
}

/*
    Write---------------
    WriteRowsEventData{tableId=85, includedColumns={0, 1, 2}, rows=[[1, 1, 1]]}

    Update--------------
    UpdateRowsEventData{tableId=85, includedColumnsBeforeUpdate={0, 1, 2},includedColumns={0, 1, 2},
            rows=[{before=[1, 1, 1], after=[1, 1, 2]}]}

    Delete--------------
    DeleteRowsEventData{tableId=85, includedColumns={0, 1, 2}, rows=[[1, 1, 2]]}


    Write---------------
    WriteRowsEventData{tableId=70, includedColumns={0, 1, 2, 3, 4, 5, 6, 7}, rows=[
    [12, 10, plan, 1, Tue Jan 01 08:00:00 CST 2019, Tue Jan 01 08:00:00 CST 2019, Tue Jan 01 08:00:00 CST 2019, Tue Jan 01 08:00:00 CST 2019]
]}

 Tue Jan 01 08:00:00 CST 2019
*/

